[XEN] Hypercall-init dom0_op takes GMFN, not MFN.
authorkfraser@localhost.localdomain <kfraser@localhost.localdomain>
Wed, 5 Jul 2006 16:16:10 +0000 (17:16 +0100)
committerkfraser@localhost.localdomain <kfraser@localhost.localdomain>
Wed, 5 Jul 2006 16:16:10 +0000 (17:16 +0100)
Signed-off-by: Steven Smith <sos22@cl.cam.ac.uk>
tools/libxc/xc_linux_build.c
xen/arch/x86/dom0_ops.c
xen/include/public/dom0_ops.h

index 8913124e74f5cdfea29f93088ffc157a19032a43..9b5f38c84a2641b09d751bff1921ff2409b1ecd9 100644 (file)
@@ -1053,7 +1053,8 @@ static int setup_guest(int xc_handle,
         if ( hypercall_pfn >= nr_pages )
             goto error_out;
         op.u.hypercall_init.domain = (domid_t)dom;
-        op.u.hypercall_init.mfn    = page_array[hypercall_pfn];
+        op.u.hypercall_init.gmfn   = shadow_mode_enabled ?
+            hypercall_pfn : page_array[hypercall_pfn];
         op.cmd = DOM0_HYPERCALL_INIT;
         if ( xc_dom0_op(xc_handle, &op) )
             goto error_out;
index c43d62b410a19024164c68f8d0ebb59169a40803..1a2f9aa303d3ecfb09235df4da5027c7b9ba4913 100644 (file)
@@ -407,15 +407,17 @@ long arch_do_dom0_op(struct dom0_op *op, XEN_GUEST_HANDLE(dom0_op_t) u_dom0_op)
 
     case DOM0_HYPERCALL_INIT:
     {
-        struct domain *d; 
-        unsigned long mfn = op->u.hypercall_init.mfn;
+        struct domain *d = find_domain_by_id(op->u.hypercall_init.domain);
+        unsigned long gmfn = op->u.hypercall_init.gmfn;
+        unsigned long mfn;
         void *hypercall_page;
 
         ret = -ESRCH;
-        if ( unlikely((d = find_domain_by_id(
-            op->u.hypercall_init.domain)) == NULL) )
+        if ( unlikely(d == NULL) )
             break;
 
+        mfn = gmfn_to_mfn(d, gmfn);
+
         ret = -EACCES;
         if ( !mfn_valid(mfn) ||
              !get_page_and_type(mfn_to_page(mfn), d, PGT_writable_page) )
index d80e0ea1ebf3683ee9c6b6acb6c7d26840dd5ab0..a95814bacd0691c09e486a7e0aeaa86fdcf7ec09 100644 (file)
@@ -509,8 +509,8 @@ DEFINE_XEN_GUEST_HANDLE(dom0_iomem_permission_t);
 
 #define DOM0_HYPERCALL_INIT   48
 struct dom0_hypercall_init {
-    domid_t  domain;          /* domain to be affected */
-    xen_pfn_t mfn;            /* machine frame to be initialised */
+    domid_t   domain;          /* domain to be affected */
+    xen_pfn_t gmfn;            /* GMFN to be initialised */
 };
 typedef struct dom0_hypercall_init dom0_hypercall_init_t;
 DEFINE_XEN_GUEST_HANDLE(dom0_hypercall_init_t);